package com.server.mongodb.dao;

import com.proto_java.PBChatHistory;
import com.proto_java.PBGetChatHistory;
import com.proto_java.PBGroupInfo;
import com.server.mongodb.domain.MGAddRequest;
import com.server.mongodb.domain.MGChatHistory;
import com.server.mongodb.domain.MGGroup;
import com.server.mongodb.domain.MGUser;

import java.util.List;
import java.util.Map;

public interface UserManage {

    /**
     * 返回单条用户信息
     * 登录验证用uid加密码的方法
     * @param uid 用户uid
     * @param password 用户密码
     * @return 用户信息
     */
    MGUser selectUser(Long uid, String password);

    /**
     * 和返回单条用户信息的方法效果一致
     * 但是这个方式需要在验证token后的请求中才可以使用哦
     * @param uid 用户uid
     * @return 用户信息
     */
    MGUser selectUser(Long uid);

    /**
     * 返回对应uid的群信息
     * @param uid 群uid
     * @return 群信息
     */
    MGGroup selectGroup(Long uid);


    /**
     * 和返回单条用户信息的方法效果一致
     * 但是这个方式需要在验证token后的请求中才可以使用哦
     * (但是这个会返回已注销的用户)
     * @param uid 用户uid
     * @return 用户信息
     */
    MGUser selectUserList(Long uid);

    /**
     * 返回对应uid的群信息(会返回已解散的群聊)
     * @param uid 群uid
     * @return 群信息
     */
    MGGroup selectGroupList(Long uid);

    /**
     * 根据传输信息返回本用户对应的未读消息的Map集合(键为用户uid,值为未读消息条数,没有未读时值为0)
     * @param dataList 好友/群列表
     * @param userUid 用户uid
     * @param isGroup 是否是群列表
     * @return 未读消息集合
     */
    Map<Long,Integer> getListUnreadMsg(List<Long> dataList, Long userUid, boolean isGroup);

    /**
     * 这个方法只有初始化时才使用一次,所有对其做了特化，并没有泛用性,要泛用建议仔细看看是否合适
     * 循环查询收到的Map集合中uid(注意,这里的集合的key才是uid),得到所有对象的最新一条聊天记录并返回
     * @param unreadMsg 全部好友和群的uid的集合
     * @param userUid 用户自己的uid
     * @return 装着有交流过的好友或群最新一条聊天记录的List
     */
    List<MGChatHistory> getInitListHistory(List<Long> unreadMsg, Long userUid);

    /**
     * 注册新用户
     * @param name 用户注册昵称
     * @param password 用户注册密码
     * @return 注册用户的uid
     */
    Long register(String name,String password);

    /**
     * 注销该uid
     * @param uid 用户uid
     * @return 执行成功结果条数
     */
    Long deleteAccount(Long uid);

    /**
     * 修改密码
     * @param uid token中拿到用户uid
     * @param password 旧密码
     * @param newPassword 新密码
     * @return 影响行数
     */
    Long updatePassword(Long uid, String password,String newPassword);

    /**
     * 更新头像和昵称
     * @param uid 用户uid
     * @param name 用户新昵称
     * @param headImage 用户头像
     * @return 匹配结果(因为可能完全一致，所以匹配到既表示更新成功)
     */
    Long updateHeadImageOrName(Long uid, String name,String headImage);

    /**
     * 创建群聊
     * @param uid 用户uid
     * @param name 群昵称
     * @return 群信息
     */
    MGGroup createGroup(Long uid, String name);

    /**
     *  添加好友或群聊的请求数据
     * @param getUid 接收方uid
     * @param sendUid 发送请求方uid
     * @param isGroup 是否为添加群聊请求
     * @return 添加数据库执行结果
     */
    MGAddRequest addRequest(Long getUid, Long sendUid, boolean isGroup);

    /**
     * 查看是否已经是好友或群成员了
     * @param getUid 接收方uid
     * @param sendUid 发送请求方uid
     * @param isGroup 是否为添加群聊请求
     * @return 执行结果
     */
    boolean isRepeat(Long getUid, Long sendUid, boolean isGroup);

    /**
     * 执行添加操作
     * @param getUid 接收方uid
     * @param sendUid 发送请求方uid
     * @return 执行结果true为成功
     */
    boolean executeAddRequest(Long getUid, Long sendUid);

    /**
     * 解散群聊
     * @param groupBossUid 群主uid
     * @param groupUid 群uid
     * @return 执行结果true为成功
     */
    boolean disbandGroup(Long groupBossUid, Long groupUid);

    /**
     * 删除好友
     * @param friendUid 好友uid
     * @param userUid 用户uid
     * @return 执行结果true为成功
     */
    boolean disbandFriend(Long friendUid, Long userUid);

    /**
     * 删除好友或群的添加请求
     * @param sendUid 发出添加请求的uid
     * @param getUid 收到添加请求的uid
     * @return 执行结果true为成功
     */
    boolean deleteAddRequest(Long sendUid, Long getUid);

    /**
     * 获取添加好友的请求数据
     * @param uid 对象uid
     * @return 数据
     */
    List<MGAddRequest> getAddRequestFriend(Long uid);

    /**
     * 获取添加群的请求数据
     * @param uid 对象uid
     * @return 数据
     */
    List<MGAddRequest> getAddRequestGroup(Long uid);

    /**
     * 标记该对象对应请求已读
     * @param uid 对象uid
     * @param isGroup 是否为群
     * @return 数据
     */
    void readAlreadyAddRequest(Long uid,boolean isGroup);

    /**
     * 将收到的聊天消息添加进数据库
     * @param data 聊天消息对象
     * @param isGroup 是否为群
     * @return 是否存在正常好友或群聊关系
     */
    boolean insertChatHistory(PBChatHistory.ChatHistory data, boolean isGroup);

    /**
     * 查询所有有过聊天记录的对象
     * @param friendUid 好友uid
     * @param groupUid 群uid
     * @param userUid 用户uid
     * @return 符合结果的uid
     */
    List<Long> getGroupAndFriendHaveChatHistory(List<Long> friendUid, List<Long> groupUid,Long userUid);

    /**
     * 查询与这个对象所需的所有聊天记录
     * @param getChatHistory 好友uid
     * @return 符合结果的聊天记录
     */
    List<MGChatHistory> getChatHistory(PBGetChatHistory.GetChatHistory getChatHistory);

    /**
     * 标记对应聊天内容为已读
     * @param sendOrGroupUid 发送消息的对象或群的uid
     * @param userUid 接收者的uid
     * @param isGroup 是否为群
     */
    void readAlreadyChatHistory(Long sendOrGroupUid,Long userUid,boolean isGroup);

    /**
     * 标记对应聊天内容为已读
     * @param userUid 群成员uid
     * @param groupUid 群uid
     */
    boolean exitGroup(Long userUid,Long groupUid);



}
